﻿using $safeprojectname$.Data;

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

using Windows.ApplicationModel.DataTransfer;
using System.Text;
using Windows.Storage.Streams;

using Windows.Graphics.Printing;
using Windows.UI;
using Windows.UI.Core;
using Windows.UI.Xaml.Printing;
using Windows.UI.Xaml.Documents;


// The Item Detail Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234232

namespace $safeprojectname$
{
    /// <summary>
    /// A page that displays details for a single item within a group while allowing gestures to
    /// flip through other items belonging to the same group.
    /// </summary>
    public sealed partial class ItemDetailPage : $safeprojectname$.Common.LayoutAwarePage
    {
        PrintDocument printDoc = new PrintDocument();

        public ItemDetailPage()
        {
            this.InitializeComponent();
        }

        private void OnPaginate(object sender, PaginateEventArgs e)
        {
            this.printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
        }

        private void OnPrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
        {
            PrintTask task = args.Request.CreatePrintTask("Document Title",
                async (taskArgs) =>
                {
                    var deferral = taskArgs.GetDeferral();
                    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        taskArgs.SetSource(printDoc.DocumentSource);
                        deferral.Complete();
                    });
                });
        }

        private void OnAddPages(object sender, AddPagesEventArgs e)
        {
            var item = (SampleDataItem)this.flipView.SelectedItem;
            var printPage = new ItemDetailPrintPage();

            ((Run)printPage.FindName("itemTitle")).Text = item.Title;
            ((Run)printPage.FindName("itemSubtitle")).Text = item.Subtitle;
            ((Run)printPage.FindName("itemContent")).Text = item.Content;

            this.printDoc.AddPage(printPage);
            this.printDoc.AddPagesComplete();
        }

        private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
        {
            var item = (SampleDataItem)this.flipView.SelectedItem;
            var printPreviewPage = new ItemDetailPrintPage();

            ((Run)printPreviewPage.FindName("itemTitle")).Text = item.Title;
            ((Run)printPreviewPage.FindName("itemSubtitle")).Text = item.Subtitle;
            ((Run)printPreviewPage.FindName("itemContent")).Text = item.Content;

            this.printDoc.SetPreviewPage(e.PageNumber, printPreviewPage);
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            printDoc.GetPreviewPage += OnGetPreviewPage;
            printDoc.AddPages += OnAddPages;
            printDoc.Paginate += OnPaginate;

            PrintManager printManager = PrintManager.GetForCurrentView();
            printManager.PrintTaskRequested += OnPrintTaskRequested;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
            if (this.printDoc == null)
                return;

            printDoc.Paginate -= OnPaginate;
            printDoc.GetPreviewPage -= OnGetPreviewPage;
            printDoc.AddPages -= OnAddPages;

            // Remove the handler for printing initialization.
            PrintManager printMan = PrintManager.GetForCurrentView();
            printMan.PrintTaskRequested -= OnPrintTaskRequested;
        }

        /// <summary>
        /// Populates the page with content passed during navigation.  Any saved state is also
        /// provided when recreating a page from a prior session.
        /// </summary>
        /// <param name="navigationParameter">The parameter value passed to
        /// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested.
        /// </param>
        /// <param name="pageState">A dictionary of state preserved by this page during an earlier
        /// session.  This will be null the first time a page is visited.</param>
        protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
        {
            // Allow saved page state to override the initial item to display
            if (pageState != null && pageState.ContainsKey("SelectedItem"))
            {
                navigationParameter = pageState["SelectedItem"];
            }

            // TODO: Create an appropriate data model for your problem domain to replace the sample data
            var item = SampleDataSource.GetItem((String)navigationParameter);
            this.DefaultViewModel["Group"] = item.Group;
            this.DefaultViewModel["Items"] = item.Group.Items;
            this.flipView.SelectedItem = item;

            // Register for DataRequested events
            DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
        }

        /// <summary>
        /// Preserves state associated with this page in case the application is suspended or the
        /// page is discarded from the navigation cache.  Values must conform to the serialization
        /// requirements of <see cref="SuspensionManager.SessionState"/>.
        /// </summary>
        /// <param name="pageState">An empty dictionary to be populated with serializable state.</param>
        protected override void SaveState(Dictionary<String, Object> pageState)
        {
            var selectedItem = (SampleDataItem)this.flipView.SelectedItem;
            pageState["SelectedItem"] = selectedItem.UniqueId;

            // Deregister the DataRequested event handler
            DataTransferManager.GetForCurrentView().DataRequested -= OnDataRequested;
        }

        void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            var request = args.Request;
            var item = (SampleDataItem)this.flipView.SelectedItem;
            request.Data.Properties.Title = item.Title;
            request.Data.Properties.Description = item.Description;

            // Share recipe text
            var itemText = item.Title + "\r\n";
            itemText += item.Subtitle + "\r\n\r\n";
            itemText += item.Content;
            itemText = itemText.Replace("\r\n", "<br/>");
            itemText = itemText.Replace("\n", "<br/>");
            
            var output = HtmlFormatHelper.CreateHtmlFormat(itemText.Trim());
            request.Data.SetHtmlFormat(output);
        }
    }
}
